/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package estrutura;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 * Grupo de disciplinas da Unicamp.
 * 
 * @author Fábio, Gustavo
 */
@Entity
@Table(name = "GRUPO")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Grupo.findAll", query = "SELECT g FROM Grupo g"),
    @NamedQuery(name = "Grupo.findById", query = "SELECT g FROM Grupo g WHERE g.id = :id")})
public class Grupo implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID único do grupo.
     */
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private Integer id;
    /**
     * Coleção de matérias pertencentes que compõem o grupo.
     */
    @JoinTable(name = "GRUPODISCIPLINAS", joinColumns = {
        @JoinColumn(name = "ID_GRUPO", referencedColumnName = "ID")}, inverseJoinColumns = {
        @JoinColumn(name = "DISCIPLINA", referencedColumnName = "SIGLA")})
    @ManyToMany
    private Collection<Materias> materias;
    
    /**
     * Construtor padrão.
     * Cria um objeto da classe Grupo sem um id e sem as matérias do grupo.
     */
    public Grupo() {
    }

    /**
     * Construtor com id.
     * Cria um objeto da classe Grupo estabelecendo um id para o Grupo.
     * @param id ID do Grupo.
     */
    public Grupo(Integer id) {
        this.id = id;
    }

    /**
     * @return Retorna o id do grupo.
     */
    public Integer getId() {
        return id;
    }

    /**
     * @param id Novo id do grupo.
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * @return Retorna uma coleção de matérias que pertencem ao grupo.
     */
    @XmlTransient
    public Collection<Materias> getMaterias() {
        return materias;
    }

    /**
     * @param materiasCollection Nova coleção de matérias que fazem parte do
     * grupo.
     */
    public void setMaterias(Collection<Materias> materiasCollection) {
        this.materias = materiasCollection;
    }
    
    /**
     * Verifica se uma disciplina pertence ao grupo.
     * @param disciplina Disciplina a ser verificada se pertence ao grupo.
     * @return true - Caso a disciplina pertença ao grupo.
     */
    public boolean contains(Materias disciplina) {
        return materias.contains(disciplina);
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Grupo)) {
            return false;
        }
        Grupo other = (Grupo) object;
        return (this.id != null || other.id == null) && (this.id == null || this.id.equals(other.id));
    }

    @Override
    public String toString() {
        return "estrutura.Grupo[ id=" + id + " ]";
    }
}